var os = require('os');  
var URL = require('url-parse');
var query = require('url-query');
var browser = require('./browser');
var device = require('./device');
var Tools = {};
Tools.getEngine = function (refer) {
	if(!refer) return ['','',''];
	// var url = new URL(refer);
	var isPay = false;
	// if(!url.query) url.query = 'kw=&query=&q=&p=';
	// var kws = query(url.query);
	if(/baidu\.com/.test(refer)){
		return ['baidu',Tools.getQueryString('kw',refer),isPay];
	}
	if(/sogou\.com/.test(refer)){
		isPay = /bill_cpc/.test(refer);
		return ['sogou',Tools.getQueryString('query',refer),isPay];
	}
	if(/www\.so\.com/.test(refer)){
		isPay = /360sou_newhome/.test(refer);
		return ['360',Tools.getQueryString('q',refer),isPay];
	}
	if(/search\.yahoo\.com/.test(refer)){
		return ['yahoo',Tools.getQueryString('p',refer),isPay];
	}
	if(/\.google\./.test(refer)){
		return ['google',Tools.getQueryString('q',refer),isPay];
	}
	if(/\.bing\.com\/search/.test(refer)){
		return ['bing',Tools.getQueryString('q',refer),isPay];
	}
	if(/www\.youdao\.com\/search/.test(refer)){
		return ['有道',Tools.getQueryString('q',refer),isPay];
	}
	return ['','',''];
}
Tools.guid = function () {
    function S4() {
       return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
    }
    return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4());
}

Tools.getClientAddress = function (req) {
    try{
        var ip = (req.headers['x-forwarded-for'] || '').split(',')[0] || req.connection.remoteAddress;
        var ipAry = ip.match(/\d*\.\d*\.\d*\.\d*/ig)
        return ipAry[0] || '';    
    }catch(e){
        console.info("getClientAddress error",e,ip);
        return '';
    }
};

Tools.getHostIP = function (req) {
	var IPv4,hostName;  
	hostName=os.hostname();  
	var nets = os.networkInterfaces().en0 || os.networkInterfaces().eth0
	for(var i=0;i<nets.length;i++){
	    if(nets[i].family=='IPv4'){
	        IPv4=nets[i].address;
	    }
	}
	return IPv4;
};
Tools.getLanguage = function (lang) {
    if (/zh-c/i.test(lang))  
    return "简体中文";  
    else if (/zh/i.test(lang))  
    return "繁體中文";  
    else if (/en/i.test(lang))  
    return "英语";  
    else if (/fr/i.test(lang))  
    return "法语";  
    else if (/de/i.test(lang))  
    return "德语";  
    else if (/jp/i.test(lang))  
    return "日语";  
    else if (/ko/i.test(lang))  
    return "韩语";  
    else if (/es/i.test(lang))  
    return "西班牙语";  
    else if (/sv/i.test(lang))  
    return "瑞典语";  
    else 
    return "其他"
};

Tools.getRefererType = function (refer,entryPage,se) {
	// 直接来源
	if(!refer){
		return 1;
	}
	// 搜索引擎来源
	if(!!se){
		return 2;
	}
	entryPage = entryPage ? entryPage : '';
	var urlRefer = new URL(refer);
	var urlEntryPage = new URL(entryPage);
	// 站内跳转
	if(urlRefer.hostname == urlEntryPage.hostname && !!urlEntryPage.hostname){
		return 4;
	}else{
		return 3;
	}
};
Tools.getBrowserName = function (name) {
	if(!name) return '';
	name = name.toLocaleLowerCase();
	if(browser[name])return browser[name];
	return name;
}
Tools.getDeviceName = function (name) {
	if(!name) return '';
	name = name.toLocaleLowerCase();
	if(device[name])return device[name];
	return name;
}

// Tools.getQueryString = function (name,url) {
// 	try{	
//     	var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
//     	var r = url.substr(1).match(reg);
//     	console.info(r);
//     	if(r!=null)return  unescape(r[2]); 
//     	return null;
// 	}catch(e){
// 		return '';
// 	}
// }

Tools.getQueryString = function(key,url){
	try{	
		var name,value;
		var str=url;
		var num=str.indexOf("?")
		str=str.substr(num+1); //取得所有参数   stringvar.substr(start [, length ]
		var arr=str.split("&"); //各个参数放到数组里
		for(var i=0;i < arr.length;i++){
			num=arr[i].indexOf("=");
			if(num>0){
				name=arr[i].substring(0,num);
				value=arr[i].substr(num+1);
				if(name == key) return decodeURIComponent(value);
			}
		}
	}catch(e){
		console.info('tools getQueryString Error',e);
		return '';
	}
	return '';
} 
Tools.getProvinceName = function(name){
	if(!name) return '其他';
	// 4个直辖市+5个自治区+2个特别行政区
	// 23个省 
	if((/市|区$/).test(name)||/北京|上海|天津|重庆|内蒙古自治区|宁夏回族自治区|新疆维吾尔自治区|西藏自治区|广西壮族自治区|香港特别行政区|澳门特别行政区/.test(name)||!/黑龙江|吉林|辽宁|江苏|山东|安徽|河北|河南|湖北|湖南|江西|陕西|山西|四川|青海|海南|广东|贵州|浙江|福建|台湾|甘肃|云南省/.test(name)){
		return name;
	}
	return name+"省";
} 
Tools.getCityName = function(name){
	if(!name) return '其他';
	if((/郑州|洛阳|焦作|商丘|信阳|周口|鹤壁|安阳|濮阳|驻马店|南阳|开封|漯河|许昌|新乡|济源|灵宝|偃师|邓州|登封|三门峡|新郑|禹州|巩义|永城|长葛|义马|林州|项城|汝州|荥阳|平顶山|卫辉|辉县|舞钢|新密|孟州|沁阳|郏县|合肥|亳州|芜湖|马鞍山|池州|黄山|滁州|安庆|淮南|淮北|蚌埠|宿州|宣城|六安|阜阳|铜陵|明光|天长|宁国|界首|桐城|福州|厦门|泉州|漳州|南平|三明|龙岩|莆田|宁德|建瓯|武夷山|长乐|福清|晋江|南安|福安|龙海|邵武|石狮|福鼎|建阳|漳平|永安|兰州|白银|武威|金昌|平凉|张掖|嘉峪关|酒泉|庆阳|定西|陇南|天水|玉门|临夏|合作|敦煌|甘南州贵阳|安顺|遵义|六盘水|兴义|都匀|凯里|毕节|清镇|铜仁|赤水|仁怀|福泉|海口|三亚|万宁|文昌|儋州|琼海|东方|五指山|石家庄|保定|唐山|邯郸|邢台|沧州|衡水|廊坊|承德|迁安|鹿泉|秦皇岛|南宫|任丘|叶城|辛集|涿州|定州|晋州|霸州|黄骅|遵化|张家口|沙河|三河|冀州|武安|河间|深州|新乐|泊头|安国|双滦区|高碑店|哈尔滨|伊春|牡丹江|大庆|鸡西|鹤岗|绥化|齐齐哈尔|黑河|富锦|虎林|密山|佳木斯|双鸭山|海林|铁力|北安|五大连池|阿城|尚志|五常|安达|七台河|绥芬河|双城|海伦|宁安|讷河|穆棱|同江|肇东|武汉|荆门|咸宁|襄阳|荆州|黄石|宜昌|随州|鄂州|孝感|黄冈|十堰|枣阳|老河口|恩施|仙桃|天门|钟祥|潜江|麻城|洪湖|汉川|赤壁|松滋|丹江口|武穴|广水|石首|大冶|枝江|应城|宜城|当阳|安陆|宜都|利川|长沙|郴州|益阳|娄底|株洲|衡阳|湘潭|岳阳|常德|邵阳|永州|张家界|怀化|浏阳|醴陵|湘乡|耒阳|沅江|涟源|常宁|吉首|津||冷水江|临湘|汨罗|武冈|韶山|湘西州长春|吉林|通化|白城|四平|辽源|松原|白山|集安|梅河口|双辽|延吉|九台|桦甸|榆树|蛟河|磐石|大安|德惠|洮南|龙井|珲春|公主岭|图们|舒兰|和龙|临江|敦化|南京|无锡|常州|扬州|徐州|苏州|连云港|盐城|淮安|宿迁|镇江|南通|泰州|兴化|东台|常熟|江阴|张家港|通州|宜兴|邳州|海门|溧阳|泰兴|如||昆山|启东|江都|丹阳|吴江|靖江|扬中|新沂|仪征|太仓|姜堰|高邮|金坛|句容|灌南县南昌|赣州|上饶|宜春|景德镇|新余|九江|萍乡|抚州|鹰潭|吉安|丰城|樟树|德兴|瑞金|井冈山|高安|乐平|南康|贵溪|瑞昌|东乡县|广丰县|信州区|三清山沈阳|葫芦岛|大连|盘锦|鞍山|铁岭|本溪|丹东|抚顺|锦州|辽阳|阜新|调兵山|朝阳|海城|北票|盖州|凤城|庄河|凌源|开原|兴城|新民|大石桥|东港|北宁|瓦房店|普兰店|凌海|灯塔|营口|西宁|格尔木|德令哈|济南|青岛|威海|潍坊|菏泽|济宁|莱芜|东营|烟台|淄博|枣庄|泰安|临沂|日照|德州|聊城|滨州|乐陵|兖州|诸城|邹城|滕州|肥城|新泰|胶州|胶南|即墨|龙口|平度|莱西|太原|大同|阳泉|长治|临汾|晋中|运城|忻州|朔州|吕梁|古交|高平|永济|孝义|侯马|霍州|介休|河津|汾阳|原平|潞城|西安|咸阳|榆林|宝鸡|铜川|渭南|汉中|安康|商洛|延安|韩城|兴平|华阴|成都|广安|德阳|乐山|巴中|内江|宜宾|南充|都江堰|自贡|泸州|广元|达州|资阳|绵阳|眉山|遂宁|雅安|阆中|攀枝花|广汉|绵竹|万源|华蓥|江油|西昌|彭州|简阳|崇州|什邡|峨眉山|邛崃|双流县昆明|玉溪|大理|曲靖|昭通|保山|丽江|临沧|楚雄|开远|个旧|景洪|安宁|宣威|杭州|宁波|绍兴|温州|台州|湖州|嘉兴|金华|舟山|衢州|丽水|余姚|乐清|临海|温岭|永康|瑞安|慈溪|义乌|上虞|诸暨|海宁|桐乡|兰溪|龙泉|建德|富德|富阳|平湖|东阳|嵊州|奉化|临安|江山|台北|台南|台中|高雄|桃源|广州|深圳|珠海|汕头|佛山|韶关|湛江|肇庆|江门|茂名|惠州|梅州|汕尾|河源|阳江|清远|东莞|中山|潮州|揭阳|云浮|南宁|贺州|玉林|桂林|柳州|梧州|北海|钦州|百色|防城港|贵港|河池|崇左|来宾|东兴|桂平|北流|岑溪|合山|凭祥|宜州|呼和浩特|呼伦贝尔|赤峰|扎兰屯|鄂尔多斯|乌兰察布|巴彦淖尔|二连浩特|霍林郭勒|包头|乌海|阿尔山|乌兰浩特|锡林浩特|根河|满洲里|额尔古纳|牙克石|临河|丰镇|通辽|银川|固原|石嘴山|青铜峡|中卫|吴忠|灵武|拉萨|日喀则|乌鲁木齐|石河子|喀什|阿勒泰|阜康|库尔勒|阿克苏|阿拉尔|哈密|克拉玛依|昌吉|奎屯|米泉|和田|香港/).test(name)){
		return name+"市";
	}
	return '其他';
} 

module.exports = Tools;